home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
C
/
Applications
/
GW AdaEd 1.4.2
/
GWAdaDemos
/
NYUDemos
/
GENQSORT.ADA
< prev
next >
Wrap
Text File
|
1993-01-31
|
3KB
|
118 lines
-- A generic sorting package, with a parallel quicksort algorithm: each
-- half of the partitioned array is sorted by a separate task.
generic
type DATA is private;
type INDEX is (<>);
with function "<"(X,Y: DATA) return BOOLEAN is <> ;
package SORTS is
type TABLE is array (INDEX range <>) of DATA;
procedure QUICKSORT (TAB: in out TABLE);
end SORTS;
package body SORTS is
procedure QUICKSORT( TAB: in out TABLE ) is
task type QSORT is
entry BOUNDS( L,R: in INDEX );
end QSORT;
-- The name of the task cannot be used as a type mark within the
-- task body. To allow recursive spawning, we make a subtype of it
subtype SQSORT is QSORT;
type AQSORT is access QSORT;
TSORT:AQSORT;
task body QSORT is
TRIGHT,TLEFT: AQSORT;
LEFT,RIGHT,IL,IR: INDEX;
MID,TEMP: DATA;
begin
accept BOUNDS( L,R: in INDEX ) do
-- Acquire bounds of subarray to sort.
LEFT := L; RIGHT := R;
end BOUNDS;
IL := LEFT; IR := RIGHT;
-- Pick partitioning element (arbitrarily, in the middle).
MID := TAB( INDEX'VAL( (INDEX'POS(IL)+INDEX'POS(IR))/2) );
loop -- partitioning step.
while TAB(IL) < MID
loop
IL:=INDEX'SUCC(IL);
end loop;
while MID < TAB(IR)
loop
IR:=INDEX'PRED(IR);
end loop;
if IL <= IR then
TEMP := TAB(IL);
TAB(IL) := TAB(IR);
TAB(IR) := TEMP;
IL:=INDEX'SUCC(IL);
IR:=INDEX'PRED(IR);
end if;
exit when IL > IR;
end loop;
if LEFT < IR then -- spawn new task for left side.
TLEFT := new SQSORT;
TLEFT.BOUNDS(LEFT,IR);
end if;
if IL < RIGHT then -- ditto for right side.
TRIGHT := new SQSORT;
TRIGHT.BOUNDS(IL,RIGHT);
end if;
end QSORT;
begin
TSORT := new QSORT; -- Main task for whole array.
TSORT.BOUNDS( TAB'FIRST, TAB'LAST );
end QUICKSORT;
end SORTS;
with SORTS;
with TEXT_IO; use TEXT_IO;
procedure MAIN is
package SORT_I is new SORTS( INTEGER, INTEGER) ;
package SORT_C is new SORTS( CHARACTER, INTEGER) ;
use SORT_I, SORT_C ;
package INT_IO is new INTEGER_IO(integer); use INT_IO;
subtype VECT is SORT_I.TABLE(1..8);
subtype CHRS is SORT_C.TABLE(1..8);
A: VECT := (-7, 14, 1, 92, 8,-6, 3, 2);
B: CHRS := "Alleluia" ;
begin
put_line("Sort integers") ;
QUICKSORT(A);
for I in A'RANGE loop
PUT (A(I));
end loop;
NEW_LINE;
put_line("Sort characters") ;
QUICKSORT(B);
for I in B'RANGE loop
PUT (B(I));
end loop;
NEW_LINE;
end MAIN;